from django.core.files.storage import Storage
from mall import settings
from fdfs_client.client import Fdfs_client

from django.utils.deconstruct import deconstructible

# 1您的自定义存储系统必须是以下子类 django.core.files.storage.Storage：
@deconstructible
class MyStorage(Storage):
    # 2.Django必须能够在没有任何参数的情况下实例化您的存储系统。
    # 这意味着任何设置都应该来自django.conf.settings
    # def __init__(self, conf_path=None,ip=None,name):  这样定义的错误的
    #                                               因为我们在初始化的时候要传参数
    def __init__(self, conf_path=None, ip=None):
        if not conf_path:
            conf_path = settings.FDFS_CLIENT_CONF
        self.conf_path = conf_path

        if not ip:
            ip = settings.FDFS_URL
        self.ip = ip

    # 3 您的存储类必须实现_open()和_save() 方法以及适用于您的存储类的任何其他方法。有关这些方法的更多信息，请参见下

    def _open(self, name, mode='rb'):
        pass

    def _save(self, name, content, max_length=None):

        #创建客户端的实例对象
        #配置文件路径
        client = Fdfs_client(self.conf_path)


        #2上传图片
        # content内容
        # read读成二进制

        # client.upload_by_filename()需要知道文件的绝对路径


        file_data = content.read()


        #3.判断上传结果
        # upload_by_buffer会返回上传结果
        result = client.upload_by_buffer(file_data)
        """
        {'Remote file_id': 'group1/M00/00/00/wKj9j1vqnniAZNAoAFbOudghO7I713.JPG',
        'Storage IP': '192.168.253.143', 'Group name': 'group1',
        'Local file name': '/home/python/Desktop/a.JPG',
         'Status': 'Upload successed.',
         'Uploaded size': '5.00MB'}

        """
        if result.get('Status')=='Upload successed.':
            #上传成功
            file_id=result.get('Remote file_id')
            return result.get('Remote file_id')
        else:
            raise Exception('上传失败')



        pass


    #exists存在
    def exists(self, name):
        # 判断文件是否存在，FastDFS可以自行解决文件的重名问题
        # 所以此处返回False，告诉Django上传的都是新文件
        return False

    def url(self, name):
        # 默认这个 url 是返回name的值
        # name的值其实就是 file_id 的值

        # 我们访问图片的时候 真实的路径是 http://ip:port/ + file_id
        # 所以我们返回url的时候 就直接 把拼接好的url返回
        # return 'http://192.168.229.133:8888/' + name
        # return settings.FDFS_URL + name
        return self.ip + name